home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / PIL / EpsImagePlugin.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-13  |  8KB  |  294 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. __version__ = '0.5'
  5. import re
  6. import string
  7. import Image
  8. import ImageFile
  9.  
  10. def i32(c):
  11.     return ord(c[0]) + (ord(c[1]) << 8) + (ord(c[2]) << 16) + (ord(c[3]) << 24)
  12.  
  13.  
  14. def o32(i):
  15.     return chr(i & 255) + chr(i >> 8 & 255) + chr(i >> 16 & 255) + chr(i >> 24 & 255)
  16.  
  17. split = re.compile('^%%([^:]*):[ \\t]*(.*)[ \\t]*$')
  18. field = re.compile('^%[%!\\w]([^:]*)[ \\t]*$')
  19.  
  20. def Ghostscript(tile, size, fp):
  21.     (decoder, tile, offset, data) = tile[0]
  22.     (length, bbox) = data
  23.     import tempfile as tempfile
  24.     import os as os
  25.     file = tempfile.mktemp()
  26.     command = [
  27.         'gs',
  28.         '-q',
  29.         '-g%dx%d' % size,
  30.         '-dNOPAUSE -dSAFER',
  31.         '-sDEVICE=ppmraw',
  32.         '-sOutputFile=%s' % file,
  33.         '- >/dev/null 2>/dev/null']
  34.     command = string.join(command)
  35.     
  36.     try:
  37.         gs = os.popen(command, 'w')
  38.         if bbox[0] != 0 or bbox[1] != 0:
  39.             gs.write('%d %d translate\n' % (-bbox[0], -bbox[1]))
  40.         
  41.         fp.seek(offset)
  42.         while length > 0:
  43.             s = fp.read(8192)
  44.             if not s:
  45.                 break
  46.             
  47.             length = length - len(s)
  48.             gs.write(s)
  49.         status = gs.close()
  50.         if status:
  51.             raise IOError('gs failed (status %d)' % status)
  52.         
  53.         im = Image.core.open_ppm(file)
  54.     finally:
  55.         
  56.         try:
  57.             os.unlink(file)
  58.         except:
  59.             pass
  60.  
  61.  
  62.     return im
  63.  
  64.  
  65. class PSFile:
  66.     
  67.     def __init__(self, fp):
  68.         self.fp = fp
  69.         self.char = None
  70.  
  71.     
  72.     def __getattr__(self, id):
  73.         v = getattr(self.fp, id)
  74.         setattr(self, id, v)
  75.         return v
  76.  
  77.     
  78.     def seek(self, offset, whence = 0):
  79.         self.char = None
  80.         self.fp.seek(offset, whence)
  81.  
  82.     
  83.     def tell(self):
  84.         pos = self.fp.tell()
  85.         if self.char:
  86.             pos = pos - 1
  87.         
  88.         return pos
  89.  
  90.     
  91.     def readline(self):
  92.         s = ''
  93.         if self.char:
  94.             c = self.char
  95.             self.char = None
  96.         else:
  97.             c = self.fp.read(1)
  98.         while c not in '\r\n':
  99.             s = s + c
  100.             c = self.fp.read(1)
  101.         if c == '\r':
  102.             self.char = self.fp.read(1)
  103.             if self.char == '\n':
  104.                 self.char = None
  105.             
  106.         
  107.         return s + '\n'
  108.  
  109.  
  110.  
  111. def _accept(prefix):
  112.     if not prefix[:4] == '%!PS':
  113.         pass
  114.     return i32(prefix) == 0xC6D3D0C5L
  115.  
  116.  
  117. class EpsImageFile(ImageFile.ImageFile):
  118.     format = 'EPS'
  119.     format_description = 'Encapsulated Postscript'
  120.     
  121.     def _open(self):
  122.         fp = PSFile(self.fp)
  123.         s = fp.read(512)
  124.         if s[:4] == '%!PS':
  125.             offset = 0
  126.             fp.seek(0, 2)
  127.             length = fp.tell()
  128.         elif i32(s) == 0xC6D3D0C5L:
  129.             offset = i32(s[4:])
  130.             length = i32(s[8:])
  131.             fp.seek(offset)
  132.         else:
  133.             raise SyntaxError, 'not an EPS file'
  134.         fp.seek(offset)
  135.         box = None
  136.         self.mode = 'RGB'
  137.         self.size = (1, 1)
  138.         s = fp.readline()
  139.         while s:
  140.             if len(s) > 255:
  141.                 raise SyntaxError, 'not an EPS file'
  142.             
  143.             if s[-2:] == '\r\n':
  144.                 s = s[:-2]
  145.             elif s[-1:] == '\n':
  146.                 s = s[:-1]
  147.             
  148.             
  149.             try:
  150.                 m = split.match(s)
  151.             except re.error:
  152.                 v = None
  153.                 raise SyntaxError, 'not an EPS file'
  154.  
  155.             if m:
  156.                 (k, v) = m.group(1, 2)
  157.                 self.info[k] = v
  158.                 if k == 'BoundingBox':
  159.                     
  160.                     try:
  161.                         box = map(int, map(float, string.split(v)))
  162.                         self.size = (box[2] - box[0], box[3] - box[1])
  163.                         self.tile = [
  164.                             ('eps', (0, 0) + self.size, offset, (length, box))]
  165.  
  166.                 
  167.             else:
  168.                 m = field.match(s)
  169.                 if m:
  170.                     k = m.group(1)
  171.                     if k == 'EndComments':
  172.                         break
  173.                     
  174.                     if k[:8] == 'PS-Adobe':
  175.                         self.info[k[:8]] = k[9:]
  176.                     else:
  177.                         self.info[k] = ''
  178.                 else:
  179.                     raise IOError, 'bad EPS header'
  180.             s = fp.readline()
  181.             if s[:1] != '%':
  182.                 break
  183.                 continue
  184.         while s[0] == '%':
  185.             if len(s) > 255:
  186.                 raise SyntaxError, 'not an EPS file'
  187.             
  188.             if s[-2:] == '\r\n':
  189.                 s = s[:-2]
  190.             elif s[-1:] == '\n':
  191.                 s = s[:-1]
  192.             
  193.             if s[:11] == '%ImageData:':
  194.                 (x, y, bi, mo, z3, z4, en, id) = string.split(s[11:], maxsplit = 7)
  195.                 x = int(x)
  196.                 y = int(y)
  197.                 bi = int(bi)
  198.                 mo = int(mo)
  199.                 en = int(en)
  200.                 if en == 1:
  201.                     decoder = 'eps_binary'
  202.                 elif en == 2:
  203.                     decoder = 'eps_hex'
  204.                 else:
  205.                     break
  206.                 if bi != 8:
  207.                     break
  208.                 
  209.                 if mo == 1:
  210.                     self.mode = 'L'
  211.                 elif mo == 2:
  212.                     self.mode = 'LAB'
  213.                 elif mo == 3:
  214.                     self.mode = 'RGB'
  215.                 else:
  216.                     break
  217.                 if id[-1:] == id[-1:]:
  218.                     pass
  219.                 elif id[-1:] == '"':
  220.                     id = id[1:-1]
  221.                 
  222.                 while None:
  223.                     s = fp.readline()
  224.                     if not s:
  225.                         break
  226.                     
  227.                     if s[:len(id)] == id:
  228.                         self.size = (x, y)
  229.                         self.tile2 = [
  230.                             (decoder, (0, 0, x, y), fp.tell(), 0)]
  231.                         return None
  232.                         continue
  233.                     continue
  234.             s[:11] == '%ImageData:'
  235.             s = fp.readline()
  236.             if not s:
  237.                 break
  238.                 continue
  239.         if not box:
  240.             raise IOError, 'cannot determine EPS bounding box'
  241.         
  242.  
  243.     
  244.     def load(self):
  245.         if not self.tile:
  246.             return None
  247.         
  248.         self.im = Ghostscript(self.tile, self.size, self.fp)
  249.         self.mode = self.im.mode
  250.         self.size = self.im.size
  251.         self.tile = []
  252.  
  253.  
  254.  
  255. def _save(im, fp, filename, eps = 1):
  256.     im.load()
  257.     if im.mode == 'L':
  258.         operator = (8, 1, 'image')
  259.     elif im.mode == 'RGB':
  260.         operator = (8, 3, 'false 3 colorimage')
  261.     elif im.mode == 'CMYK':
  262.         operator = (8, 4, 'false 4 colorimage')
  263.     else:
  264.         raise ValueError, 'image mode is not supported'
  265.     if eps:
  266.         fp.write('%!PS-Adobe-3.0 EPSF-3.0\n')
  267.         fp.write('%%Creator: PIL 0.1 EpsEncode\n')
  268.         fp.write('%%%%BoundingBox: 0 0 %d %d\n' % im.size)
  269.         fp.write('%%Pages: 1\n')
  270.         fp.write('%%EndComments\n')
  271.         fp.write('%%Page: 1 1\n')
  272.         fp.write('%%ImageData: %d %d ' % im.size)
  273.         fp.write('%d %d 0 1 1 "%s"\n' % operator)
  274.     
  275.     fp.write('gsave\n')
  276.     fp.write('10 dict begin\n')
  277.     fp.write('/buf %d string def\n' % im.size[0] * operator[1])
  278.     fp.write('%d %d scale\n' % im.size)
  279.     fp.write('%d %d 8\n' % im.size)
  280.     fp.write('[%d 0 0 -%d 0 %d]\n' % (im.size[0], im.size[1], im.size[1]))
  281.     fp.write('{ currentfile buf readhexstring pop } bind\n')
  282.     fp.write('%s\n' % operator[2])
  283.     ImageFile._save(im, fp, [
  284.         ('eps', (0, 0) + im.size, 0, None)])
  285.     fp.write('\n%%%%EndBinary\n')
  286.     fp.write('grestore end\n')
  287.     fp.flush()
  288.  
  289. Image.register_open(EpsImageFile.format, EpsImageFile, _accept)
  290. Image.register_save(EpsImageFile.format, _save)
  291. Image.register_extension(EpsImageFile.format, '.ps')
  292. Image.register_extension(EpsImageFile.format, '.eps')
  293. Image.register_mime(EpsImageFile.format, 'application/postscript')
  294.